iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
1

使用Laravel 8 PHP主流框架打造RESTful API(iT邦幫忙鐵人賽系列書)ISBN:9789864345304

本系列文章已集結成冊與鐵人賽文章差異內容,有以下幾點:

更新至Laravel 8、基礎的PHP重點筆記、加強製作API流程細節、加入程式設計模式,優化、重構程式碼的部分,並且於書籍前面的章節介紹Git。

讓您從製作第一個簡單的API到優化自己的程式碼,分享我的經驗給您,打造自己的最強大腦API,若有興趣的朋友可以參考看看

天瓏網路書局:
https://www.tenlong.com.tw/products/9789864345304


今天也是先把簡單的處理完,今天來製作,刪除動物功能。

Method URI Name Action Middleward
DELETE api/animal/{animal} anumal.destroy App\Http\Controllers\AnimalController@destroy api

用 HTTP DELETE 動詞請求 api/animal/1 表示刪除 id 為 1 的動物資料。

AnimalController

// 路由有設定 animal 變數,這裡設定它是 Animal 模型,所以會自動找出該ID的實體物件
public function destroy(Animal $animal)
{
    // 把這個實體物件刪除
    $animal->delete();
    // 回傳 null 並且給予 204 狀態碼
    return response(null, Response::HTTP_NO_CONTENT);
}

完成!簡單吧!補充一下返回的response 通常我都怎麼寫的。

Delete 動詞方法如何回應資料

我都是這樣做

有找到資料,然後刪除成功,我會回傳狀態碼 204 (No Content) 的回應

可能有些需要由後端處理,檔案比較大或系統流量大,不想要讓使用者等,可以先回傳 202 (Accepted) 表示你的請求,伺服器有收到,排隊等待處理中還沒有被執行,讓前端介面有對應的處理方式不需要等待,提升使用者體驗。

如果找不到資源 回傳 404 Not Found

嘗試可不可以運行

打開 Postman 動作改為 DELETE

Headers 如下圖顯示即可
postman設定

按下Send animals資料表原本有一筆資料就會被刪除囉!

資料庫內容

如果這時候再送一次請求呢?

再送一次出現錯誤了

再送一次請求以後發現出現錯誤了 QQ

異常處理

我們來處理一下這個異常

/animal/app/Exceptions/Handler.php

public function render($request, Exception $exception)
{
    // 讓它顯示一下是哪一個異常狀況
    dd($exception);
    
    return parent::render($request, $exception);
}

在render 方法中 加入 dd($exception) 讓他印出異常,Postman 再送一次請求

印出異常

發現是 ModelNotFoundException 這個例外,我們來攔截這個異常

因為ID:1 的內容已經不存在資料表了,導致出現狀況

把攔截錯誤的程式碼寫在 render 方法中(原本印出異常的程式碼 dd($exception); 可以刪掉)

use Illuminate\Database\Eloquent\ModelNotFoundException;

public function render($request, Exception $exception)
{
    if ($request->expectsJson()) {
        if ($exception instanceof ModelNotFoundException) {
            return response()->json(
                [
                    'error' => '找不到資源'
                ],
                Response::HTTP_NOT_FOUND
            );
        }
    }
    return parent::render($request, $exception);
}

程式碼解釋,使用者請求回傳JSON 格式,發現有錯誤 ModelNotFoundException 被拋出,因為Model 沒有抓到資料,回傳 404 Not Found 並附上錯誤資訊。

再送一次相同請求!如下圖表示成功囉!

正確顯示錯誤訊息

此篇文章同步發到個人部落格


上一篇
實作資料庫以及新建動物的方法
下一篇
更新動物資料
系列文
使用 Laravel 打造 RESTful API30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0

use use Illuminate\Database\Eloquent\ModelNotFoundException;
這段多了一個use

Victor iT邦新手 2 級 ‧ 2020-10-30 09:26:25 檢舉

謝謝你/images/emoticon/emoticon41.gif

0
st474ddr
iT邦新手 2 級 ‧ 2020-12-29 17:10:01

想請問大大
在Laravel 8 的架構下
Handler 的架構也不太一樣
直接加入Render function會報出不少錯誤
爬了一下文檔 好像要用renderable 寫在 register function裡面
但似懂非懂 不太曉得怎麼實作出大大這個效果

還有一個新手問題
為什麼有好多的use要自己加
而Laravel沒有先預設好
還是這也是因為版本的差別

Victor iT邦新手 2 級 ‧ 2020-12-30 23:00:04 檢舉

Laravel 8版本已經將這邊改版了!
Handler檔案預設沒有寫好render方法覆寫父類別
可以查看父類別的內容,將render方法複製過來
並且使用use 呼叫需要的類別

建議可以增加一些物件導向的設計模式
use 用於引用各種需要使用的類別或介面...

我要留言

立即登入留言